package com.wongoing.base;

import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;


/**
 * 功能说明 ：数据访问基础接口
 * 修改说明
 * @author 郑立兵
 * @date 2017-03-22 上午11:47:54
 * @version V1.0
 */
public interface BaseDao<T, Serializable> {
	/**
	 * 功能说明：按主键查询-单值主键
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:43:05
	 * @param id 主键值
	 * @return	返回对应的实体对象
	 */
	public T getByPrimaryKey(Serializable id);
	/**
	 * 功能说明：按主键查询-组合主键
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:44:41
	 * @param param 组合主键参数，可以是实体对象，可以是map
	 * @return 返回对应的实体对象
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public T getByPrimaryKeys(Object param) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException;
	/**
	 * 功能说明：参数查询
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:46:06
	 * @param param 查询参数，可以是实体对象，可以是map
	 * @return 返回符合条件的实体集合
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public List<T> getByParam(Object param) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException;
	/**
	 * 功能说明：按Mapper文件中的语句ID和参数查询
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:47:05
	 * @param statementId Mapper文件中的语句ID
	 * @param param 查询参数
	 * @return 返回符合条件的实体集合
	 */
	//public List<T> getByStatementParam(String statementId, Map<String, Object> param);
	/**
	 * 功能说明：按参数分页查询
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:49:02
	 * @param pageResult 带查询参数的分页对象，需在pageResult中传入pageIndex、pageSize、param
	 * @return 返回带结果数据的分页实体对象，在pageResult中返回totalSize、pageCount、data
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public PageResult<T> getPageByParam(PageResult<T> pageResult) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException;
	/**
	 * 功能说明：条件查询
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:52:51
	 * @param whereParam 查询条件，需要在map中增加key为where的键值对作为查询条件字符串（不带where关键词）
	 * @return 返回符合条件的实体集合
	 */
	public List<T> getByWhere(Map<String, Object> whereParam);
	/**
	 * 功能说明：按条件分页查询
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:54:44
	 * @param pageResult 带查询条件的分页对象，需在pageResult中传入pageIndex、pageSize、where
	 * @return 返回带结果数据的分页实体对象，在pageResult中返回totalSize、pageCount、data
	 */
	public PageResult<T> getPageByWhere(PageResult<T> pageResult);
	/**
	 * 功能说明：查询记录数
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:15:48
	 * @return 返回表中记录总数
	 */
	public int count();
	/**
	 * 功能说明：按参数查询记录数
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:19:47
	 * @param param 参数，可以是实体对象，可以是map
	 * @return 返回符合参数值的记录数
	 */
	public int countByParam(Map<String, Object> param);
	/**
	 * 功能说明：按条件查询记录数
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:22:00
	 * @param where 条件，条件字符串中不包括where关键词
	 * @return
	 */
	public int countByWhere(String where);
	/**
	 * 功能说明：追加记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:25:31
	 * @param entity 实体对象
	 * @return 返回追加的记录数
	 */
	public int insert(T entity);
	/**
	 * 功能说明：批量追加记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:26:39
	 * @param list 实体对象集合
	 * @return 返回追加的记录数
	 */
	public int insertBatch(List<T> list);
	/**
	 * 功能说明：按主键更新
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:28:06
	 * @param entity 要更新的实体对象
	 * @return 返回更新的记录数
	 */
	public int updateByPrimaryKey(T entity);
	/**
	 * 功能说明：批量更新
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:29:36
	 * @param list 要更新的实体对象集合
	 * @return 返回更新的记录数
	 */
	public int updateBatch(List<T> list);
	/**
	 * 功能说明：按主键删除-单值主键
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:37:04
	 * @param id 主键值
	 * @return 返回删除的记录数
	 */
	public int deleteByPrimaryKey(Serializable id);
	/**
	 * 功能说明：按主键删除-组合主键
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:37:56
	 * @param param 组合主键值，可以是实体对象，也可以是map
	 * @return 返回删除的记录数
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public int deleteByPrimaryKeys(Object param) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException;
	/**
	 * 功能说明：按参数删除记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:39:34
	 * @param param 参数
	 * @return 返回删除的记录数
	 */
	public int deleteByParam(Map<String, Object> param);
	/**
	 * 功能说明：批量删除
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:42:03
	 * @param ids 要删除的主键值集合
	 * @return 返回删除的记录数
	 */
	public int deleteBatch(List<Serializable> ids);
	/**
	 * 功能说明：按条件删除记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:43:08
	 * @param where 条件字符串（不包含where关键词）
	 * @return 返回删除的记录数
	 */
	public int deleteByWhere(String where);
	/**
	 * 功能说明：清空表中记录，即截断表（truncate）
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:45:48
	 */
	public void clean();
}
